package com.jxb.myshop.services.impl;

import com.jxb.myshop.common.Constant;
import com.jxb.myshop.common.ResponseResult;
import com.jxb.myshop.dao.UserDao;
import com.jxb.myshop.dao.impl.UserDaoImpl;
import com.jxb.myshop.entity.User;
import com.jxb.myshop.services.UserServices;
import com.jxb.myshop.util.*;

import java.sql.SQLException;

public class UserServicesImpl implements UserServices {
    private UserDao ud = new UserDaoImpl();

    @Override
    public boolean insertUser(User u) {
        try {
            // 1.处理 user 对象 生成一个激活码 使用工具类生成激活码
            u.setUcode(RandomUtils.createActive());
            // 2.设置用户是管理员还是普通会员，因为这是普通会员登录界面所以全设置为普通会员
            u.setUrole(Constant.User.COMMENT_VIP_USER);
            // 3.设置激活状态，因为是新创建的，所以都是未激活状态
            u.setUstatus(Constant.User.USER_IS_NOT_ACTIVE);
            // 4.给密码加密
            u.setUpassword(MD5Utils.md5(u.getUpassword()));
            // 5.访问dao层新增数据
            if (ud.insertUser(u) > 0) {
                // 6.新增成功，就发送激活邮件让用户激活
                // 因为注册完成就会立即跳转到新增成功页面，而这个发送信息
                // 在人数多的情况下会有卡顿的情况，为了第一时间给用户响应
                // 所以邮件发送这个方法要用到多线程
                //            new Thread(new Runnable() {
                //                @Override
                //                public void run() {
                //                    EmailUtils.sendEmail(u);
                //                }
                //            });
                new Thread(() -> EmailUtils.sendEmail(u)).start();
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    @Override
    public ResponseResult doActive(String e, String c) {
        try {
            // 1.把传入的两个参数进行解码
            String email = Base64Utils.decode(e);
            String code = Base64Utils.decode(c);
            // 2.通过邮箱和激活码，查询数据中有没有这两个的user
            User u = ud.getUserByEmailAndCode(email, code);
            // 用户不存在
            if (u == null) {
                return ResponseResult.createFail("用户不存在，请先注册在登录");
            }
            // 3.判断这个账户是否已经激活
            if (u.getUstatus() == Constant.User.USER_IS_ACTIVE) {
                // 用户已经激活
                return ResponseResult.createFail("该账户已激活，无需再激活");
            }
            // 4.开始激活
            if (ud.changeUserStatus(u.getUid(), Constant.User.USER_IS_ACTIVE) > 0) {
                return ResponseResult.createSuccess("激活成功，请登录");
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return ResponseResult.createFail("激活失败，请稍后再试");
    }

    /**
     * 验证登录
     *
     * @param username
     * @param password
     * @return
     */
    @Override
    public ResponseResult doVerify(String username, String password) {
        try {
            if (StringUtil.isNotNull(username, password)) {
                User user = ud.getUserByName(username);
                // 判断用户数据是否存在,以及密码是否激活
                // password 没有加密的,需要先把他加密再去比较
                if (user != null && MD5Utils.md5(password).equals(user.getUpassword())) {
                    // 判断用户是否已经注册
                    if (user.getUstatus() == Constant.User.USER_IS_ACTIVE) {
                        // 注册成功，返回封装user的ResponseResult对象
                        return ResponseResult.createSuccess(user);
                    }
                    // 注册成功但是未激活的，得先激活才能登陆
                    return ResponseResult.createFail("用户尚未激活，请先激活在登陆");

                } else {
                    return ResponseResult.createFail("你输入的用户不存在，请先注册");
                }
            } else {

            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return ResponseResult.createFail("用户名或密码有误");
    }

    @Override
    public User getUserByName(String username) {
        try {
            return ud.getUserByName(username);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
